昨天簡單的介紹了 Macro 以及 Macro 的類型,今天來介紹一個 Macro:@Observable。
@Observable 主要在做的事情就是將一個類型的所有屬性自動加上觀察的功能,那原本要觀察一個屬性,需要做一些事情。第一個就是訂閱,需要能接收資料發生變化時的通知。第二個就是資料改變時,它要去通知訂閱者資料改變。
雖然就這兩步驟,但在實作上還是挺麻煩的,所以今年出的 @Observable 就是在幫你完成上面提到的事情。
使用方法也很簡單,第一步 import Observation:
import Observation
第二部,在要觀察的類型前加上 @Observable,這裡要注意 @Observable 只能加在 reference type 的類型前面,而且類型裡的所有屬性都必須要有預設值,這是 @Observable 要求的。
@Observable
class Test {
var name: String = ""
}
那到這裡基本上就完成了,之後只要是有使用到這個類型裡的屬性 SwiftUI 會自動追蹤並通知畫面去做更新。
那最後再來看一下 Macro 展開後的樣子。
@Observable
class Test {
@ObservationTracked
var name: String = ""
@ObservationIgnored private let _$observationRegistrar = Observation.ObservationRegistrar()
internal nonisolated func access<Member>(
keyPath: KeyPath<Test , Member>
) {
_$observationRegistrar.access(self, keyPath: keyPath)
}
internal nonisolated func withMutation<Member, MutationResult>(
keyPath: KeyPath<Test , Member>,
_ mutation: () throws -> MutationResult
) rethrows -> MutationResult {
try _$observationRegistrar.withMutation(of: self, keyPath: keyPath, mutation)
}
}
extension Test: Observation.Observable {
}
那今天就先介紹到這裡啦。